<?php
/**
 * @APP@
 *
 * PHP versions 5
 *
 * @category   BEAR
 * @package    App
 * @subpackage App_Ro
 * @author     $Author: anonymous $ <anonymous@example.com>
 * @version    SVN: Release: $Id:$
 */

/**
 * アプリケーショリソースオブジェクト
 *
 * @category   BEAR
 * @package    App
 * @subpackage App_Ro
 * @author     $Author: anonymous $ <anonymous@example.com>
 * @copyright  anonymous All rights reserved.
 * @version    SVN: Release: $Id:$
 */
class App_Ro extends BEAR_Ro
{
    /**
     * ユーザー
     *
     * @var string
     */
    const TABLE_USER = 'users';

    /**
     * プロフィール
     *
     * @var string
     */
    const TABLE_PROFILE = 'profile';

    /**
     * エントリー
     *
     * @var string
     */
    const TABLE_ENTRY = 'entries';

    /**
     * フォロワー
     *
     * @var string
     */
    const TABLE_FOLLOWERS = 'followers';

    /**
     * DB
     *
     * @var MDB2
     */
    protected $_db;

    /**
     * コンストラクタ
     *
     * @param array $config 設定
     */
    public function __construct(array $config)
    {
        parent::__construct($config);
    }

    /**
     * インジェクタ
     *
     * <pre>
     * 操作によってDBオブジェクトを変更します
     *
     * read操作はdsnをslaveに、DBページャーを利用可能に。
     * その他操作はdsnをdefaultに、トランザクション可能にしExtendedモジュール読み込みます
     * </pre>
     */
    public function onInject()
    {
        $app = BEAR::get('app');
        assert(is_string($app['App_Db']['dsn']['default']));
        assert(is_string($app['App_Db']['dsn']['slave']));
        assert(isset($this->_config['method']));
        $options['default_table_type'] = 'INNODB';
        if ($this->_config['method'] === 'read') {
            $dsn = $app['App_Db']['dsn']['slave'];
            $config = array('dsn' => $dsn, 'options' => $options);
            $this->_db = BEAR::dependency('BEAR_Mdb2', $config);
            $this->_queryConfig =  array('db'=>&$this->_db, 'ro'=>&$this, 'table'=>$this->_table, 'pager'=>0, 'perPage'=>10, 'options'=>array('accesskey'=>true));
        } else {
            $dsn = $app['App_Db']['dsn']['default'];
            $options['use_transactions'] = true;
            $config = array('dsn' => $dsn, 'options' => $options);
            $this->_db = BEAR::dependency('BEAR_Mdb2', $config);
            $this->_db->loadModule('Extended');
            $this->_queryConfig =  array('db'=>&$this->_db, 'ro'=>&$this, 'table'=>$this->_table);
        }
        // すべてのフィールド識別子が SQL 文中で自動的にクォート
        $this->_db->setOption('quote_identifier', true);
    }

    /**
     * インジェクタ
     *
     * SELECTクエリーをCOUNTに変更します
     *
     */
    public function onInjectCount()
    {
        $this->onInject();
        $this->_query = BEAR::dependency('BEAR_Query_Count', $this->_queryConfig);
    }

        /**
     * テストインジェクト
     *
     * @return void
     */
    public function onTestInject()
    {
        parent::onInject();
        //プロパティを注入
        $this->_auth = array(
            'user' => array('id' => '6',
                'user_name' => 'dummy user id=6',
                'email' => 'bear-project@gmail.com',
                'password' => '4a7d1ed414474e4033ac29ccb8653d9b',
                'image' => '8f14e45fceea167a5a36dedd4bea2543',
                'is_private' => '0',
                'created_at' => '2009-05-27 21:06:07',
                'updated_at' => '2009-06-17 16:20:19',
                'deleted_at' => '0000-00-00 00:00:00',
                'act_key' => '7ae205c5dc6a965858eccee0414368fa'),
            'profile' => NULL);
        //引数を注入
        $this->injectArg('tab', 'public');
        $this->_msg = 'onTestInjectでテスト中です';
    }

    /**
     * DB取得
     *
     * @return MDB2
     *
     */
    public function getDb()
    {
        return $this->_db;
    }
}
